package com.edu.exam.entity.examination.control;

import com.edu.exam.enums.examination.security.SecurityAlertType;
import com.edu.exam.enums.examination.security.SecurityAlertLevel;
import com.edu.exam.enums.examination.security.SecurityAlertStatus;
import com.edu.exam.enums.examination.security.SecurityAlertPriority;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 安全警报实体类
 * 所属模块：E-01 考试执行模块
 * 对应数据库表：security_alert
 *
 * <p>安全警报实体用于记录和管理安全监控过程中产生的警报信息，包括
 * 警报触发、确认、处理、关闭等。支持完整的警报生命周期管理。</p>
 *
 * <p>核心功能：
 * - 警报触发：根据规则触发安全警报
 * - 警报确认：确认警报的真实性和有效性
 * - 警报处理：处理警报并采取相应措施
 * - 警报升级：根据情况升级警报级别
 * - 警报关闭：完成处理后关闭警报</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class SecurityAlert {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 警报ID
     *
     * <p>安全警报的唯一标识符，采用UUID格式生成。</p>
     */
    @Column(name = "alert_id", nullable = false, length = 32, unique = true)
    private String alertId;

    /**
     * 任务ID
     *
     * <p>关联的监控任务ID。</p>
     */
    @Column(name = "task_id", nullable = false, length = 32)
    private String taskId;

    /**
     * 事件ID
     *
     * <p>关联的安全事件ID，可为空。</p>
     */
    @Column(name = "event_id", length = 32)
    private String eventId;

    /**
     * 警报类型
     *
     * <p>警报的类型。
     * 支持的类型：THREAT（威胁）、VIOLATION（违规）、ANOMALY（异常）、SYSTEM（系统）、SECURITY（安全）等</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "alert_type", nullable = false, length = 50)
    private SecurityAlertType alertType;

    /**
     * 警报级别
     *
     * <p>警报的严重程度级别。
     * 支持的级别：INFO（信息）、WARNING（警告）、ERROR（错误）、CRITICAL（关键）、FATAL（致命）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "alert_level", nullable = false, length = 20)
    private SecurityAlertLevel alertLevel;

    /**
     * 警报标题
     *
     * <p>警报的标题。</p>
     */
    @Column(name = "alert_title", nullable = false, length = 200)
    private String alertTitle;

    /**
     * 警报描述
     *
     * <p>警报的详细描述。</p>
     */
    @Column(name = "alert_description", columnDefinition = "TEXT", length = 1000)
    private String alertDescription;

    /**
     * 触发时间
     *
     * <p>警报被触发的时间。</p>
     */
    @Column(name = "trigger_time", nullable = false)
    private LocalDateTime triggerTime;

    /**
     * 警报状态
     *
     * <p>警报的处理状态。
     * 支持的状态：OPEN（开放）、ACKNOWLEDGED（已确认）、PROCESSING（处理中）、RESOLVED（已解决）、CLOSED（已关闭）、IGNORED（已忽略）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "alert_status", nullable = false, length = 20)
    private SecurityAlertStatus alertStatus = SecurityAlertStatus.OPEN;

    /**
     * 处理者ID
     *
     * <p>处理警报的操作者ID。</p>
     */
    @Column(name = "handler_id", length = 32)
    private String handlerId;

    /**
     * 确认时间
     *
     * <p>警报被确认的时间。</p>
     */
    @Column(name = "acknowledged_time")
    private LocalDateTime acknowledgedTime;

    /**
     * 处理开始时间
     *
     * <p>开始处理警报的时间。</p>
     */
    @Column(name = "processing_start_time")
    private LocalDateTime processingStartTime;

    /**
     * 解决时间
     *
     * <p>警报被解决的时间。</p>
     */
    @Column(name = "resolved_time")
    private LocalDateTime resolvedTime;

    /**
     * 关闭时间
     *
     * <p>警报被关闭的时间。</p>
     */
    @Column(name = "closed_time")
    private LocalDateTime closedTime;

    /**
     * 触发规则ID
     *
     * <p>触发警报的规则ID。</p>
     */
    @Column(name = "trigger_rule_id", length = 32)
    private String triggerRuleId;

    /**
     * 触发规则名称
     *
     * <p>触发警报的规则名称。</p>
     */
    @Column(name = "trigger_rule_name", length = 100)
    private String triggerRuleName;

    /**
     * 优先级
     *
     * <p>警报的优先级。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "priority", length = 20)
    private SecurityAlertPriority priority = SecurityAlertPriority.NORMAL;

    /**
     * 严重程度评分
     *
     * <p>警报的严重程度评分，范围0-10。</p>
     */
    @Column(name = "severity_score", precision = 3, scale = 1)
    private Float severityScore = 0.0f;

    /**
     * 影响范围
     *
     * <p>警报的影响范围描述。</p>
     */
    @Column(name = "impact_scope", length = 500)
    private String impactScope;

    /**
     * 处理建议
     *
     * <p>警报的处理建议。</p>
     */
    @Column(name = "handling_suggestions", columnDefinition = "TEXT", length = 1000)
    private String handlingSuggestions;

    /**
     * 处理措施
     *
     * <p>实际采取的处理措施。</p>
     */
    @Column(name = "handling_actions", columnDefinition = "TEXT", length = 1000)
    private String handlingActions;

    /**
     * 处理结果
     *
     * <p>警报处理的结果说明。</p>
     */
    @Column(name = "handling_result", length = 1000)
    private String handlingResult;

    /**
     * 警报标签
     *
     * <p>JSON格式的警报标签。</p>
     */
    @Column(name = "alert_tags", columnDefinition = "TEXT")
    private String alertTags;

    /**
     * 警报备注
     *
     * <p>警报的备注信息。</p>
     */
    @Column(name = "alert_notes", columnDefinition = "TEXT")
    private String alertNotes;

    /**
     * 是否误报
     *
     * <p>标记是否为误报。</p>
     */
    @Column(name = "is_false_positive")
    private Boolean isFalsePositive = false;

    /**
     * 误报原因
     *
     * <p>误报的原因说明。</p>
     */
    @Column(name = "false_positive_reason", length = 500)
    private String falsePositiveReason;

    /**
     * 重复次数
     *
     * <p>相同警报的重复次数。</p>
     */
    @Column(name = "repeat_count")
    private Integer repeatCount = 0;

    /**
     * 首次触发时间
     *
     * <p>首次触发此类警报的时间。</p>
     */
    @Column(name = "first_trigger_time")
    private LocalDateTime firstTriggerTime;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 版本号
     */
    @Column(name = "version", nullable = false)
    private Integer version = 1;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 枚举引用已迁移到独立枚举类 =====
}